
#include <vector>

using namespace std;

//esse define deve ser atualizado em lexico.h tambem. viva a engenharia de software e ao tempo livre!
#define MAXTOKENLEN 100

enum TIPO {SEMTIPO,BOOLEANO,INTEIRO,RETORNO_INTEIRO,RETORNO_BOOLEANO,PROCEDIMENTO};
enum ESCOPE {NEUTRO,ABRE,FECHA};
enum GRAUPARENTESCO{EU,PAI,VO};


struct linhaTabSimbolo
{	
	char simbolo[MAXTOKENLEN];
	char lexema[MAXTOKENLEN];
	TIPO tipoVar;
	int endereco;
	char rotulo[MAXTOKENLEN];
	char nivel;

};

typedef linhaTabSimbolo linhaTabSimbolo_T;

////globals... var






int initSemantico(System::String^ caminhoArquivo);
void insere_tabela(linhaTabSimbolo_T simbolTemp);
//void insere_tabela(char * lexema,TIPO tipoVar=SEMTIPO,unsigned int endereco=-1,ESCOPE escopo=NEUTRO,char * simbolo ="");
void insere_tabela(char * lexema,char * simbolo,char nivel,char * rotulo,int enderecoMemoria=-1);
void insere_tabela(char * lexema,char * simbolo,char nivel,char * rotulo,TIPO tipo);
bool isRepetidoLexema(char * lexema);
int logaErroSemanticoIflexemaIsDuplicated(char * lexema,char * simbolo="");
int getSizeTabSim();
//System::Collections::ArrayList^ Expressao_posfixa(System::String^ expressao);
System::Collections::ArrayList^ Expressao_posfixa(System::Collections::ArrayList^ expressao);
int gerar_codigo_expressao(System::Collections::ArrayList^ expressao_pos_fixa);
void  * getPointerToTabSim();
void InitNivel(vector <char> * pointerToMeuNivel);
int VerificaExpressao(System::Collections::ArrayList^ expressao);
System::Collections::ArrayList^ TipoExpressao(System::Collections::ArrayList^ expressao);

bool pesquisa_declvar_tabela(char * lexema,int * ponteiroPraRetornarValor);
bool pesquisa_declvar_tabela(char * lexema,TIPO * tipo);
bool pesquisa_declvar_tabela(char * lexema);
bool pesquisa_declproc_tabela(char * lexema,char * label=NULL);
bool isRepetidoLexemaSameScope(char * lexema);
bool pesquisa_declvar_tabela(char * lexema,linhaTabSimbolo_T * linhaRetorno);